﻿// Matt's TinyMVC Copyright (c) 2009 Matt J. Crouch

// Permission is hereby granted, free of charge, to any person obtaining a copy of this software
// and associated documentation files (the "Software"), to deal in the Software without restriction, 
// including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
// and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies
// or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.Linq;
using MattsTinyMVC;
using PurchasingSampleApplication.Properties;

namespace PurchasingSampleApplication
{
    public enum ShippingMethod
    {
        Overnight,
        SecondDay,
        PriorityMail
    }

    [Serializable]
    public class PurchasingDepartmentController : BaseController
    {
        public PurchasingDepartmentController() : base()
        {
        }

        public IEnumerable GetShippingMethods()
        {
            var shippingMethods = from sm in Enum.GetValues(typeof(ShippingMethod)) as int[]
                                  select new
                                  {
                                      ShippingMethodName = Enum.GetName(typeof(ShippingMethod), sm),
                                      ShippingMethodValue = sm
                                  };

            return shippingMethods;
        }

        [TrackModels]
        internal ObservableCollection<PurchaseOrder> _purchaseOrders = null;
        public IEnumerable<PurchaseOrder> PurchaseOrders
        {
            get { return _purchaseOrders; }
        }

        public PurchaseOrder CreateNewPurchaseOrder()
        {
            PurchaseOrder purchaseOrder = new PurchaseOrder();
            _purchaseOrders.Add(purchaseOrder);
            _currentPurchaseOrder = purchaseOrder;
            StatusMessage = "Created new purchase order";
            return purchaseOrder;
        }

        private PurchaseOrder _currentPurchaseOrder;
        public PurchaseOrder CurrentPurchaseOrder
        {
            get
            {
                if (_currentPurchaseOrder == null)
                    CreateNewPurchaseOrder();
                return _currentPurchaseOrder;
            }
        }

        public bool IsInEditMode { get; set; }
        public void BeginEdit()
        {
            IsInEditMode = true;
        }

        public string StatusMessage { get; set; }
        
        public void SaveCurrentPurchaseOrder()
        {
            IsInEditMode = false;
            StatusMessage = string.Format(CultureInfo.CurrentCulture, Resources.SavedMessage, DateTime.Now);
        }

        public int PurchaseOrderCount
        {
            get { return _purchaseOrders.Count; }
        }

        public int CurrentPurchaseOrderIndex
        {
            get { return _purchaseOrders.IndexOf(CurrentPurchaseOrder) + 1; }
        }

        public bool CanMoveNext
        {
            get { return CurrentPurchaseOrderIndex < PurchaseOrderCount; }
        }

        public void MoveNext()
        {
            int nextIndex = _purchaseOrders.IndexOf(CurrentPurchaseOrder) + 1;
            _currentPurchaseOrder = _purchaseOrders[nextIndex];
        }

        public bool CanMovePrevious
        {
            get { return CurrentPurchaseOrderIndex > 1; }
        }

        public void MovePrevious()
        {
            int previousIndex = _purchaseOrders.IndexOf(CurrentPurchaseOrder) - 1;
            _currentPurchaseOrder = _purchaseOrders[previousIndex];
        }
    }
}